# -*- coding: utf-8 -*-
# @Author  : longbhu
# @Time    : 2025/3/21 15:14
# @Function: 第三步：合并成一个大图；将大图再次裁剪。
import glob
import os
import rasterio
# from calc_v1.tif_tools import merge_tif_files_for_one
from rasterio.merge import merge
from rasterio.plot import show

def merge_tif_files_for_one(input_path, merge_name):
    """
    合并文件夹下的所有tif文件为一个文件。
    输出文件保存在输入的文件夹下创建的merged文件夹中
    参数:
    input_path -- 输入文件夹的路径，包含所有tif文件。
    merge_name -- 输出合并文件的名称。
    """
    # 获取文件夹下的所有tif文件
    input_files = glob.glob(os.path.join(input_path, '*.tif'))
    print(f"查找到 {len(input_files)} 个tif文件。")

    if not input_files:
        print("没有找到任何tif文件。")
        return

    # 存储有效的tif文件
    src_files_to_mosaic = []

    for fn in input_files:
        src = rasterio.open(fn)
        if src is None:
            print(f"文件 {fn} 无法打开，跳过此文件。")
            continue
        src_files_to_mosaic.append(src)

    # 如果没有有效的输入文件，退出函数
    if not src_files_to_mosaic:
        print("没有有效的输入文件，无法进行合并。")
        return

    # 确保输出文件夹存在
    output_file = os.path.join(input_path, 'merged', merge_name + '_merged_rasterio.tif')
    os.makedirs(os.path.dirname(output_file), exist_ok=True)

    # 使用rasterio.merge进行合并
    mosaic, out_trans = merge(src_files_to_mosaic)

    # 获取第一个文件的元数据
    out_meta = src_files_to_mosaic[0].meta.copy()

    # 更新元数据
    out_meta.update({
        "driver": "GTiff",
        "height": mosaic.shape[1],
        "width": mosaic.shape[2],
        "transform": out_trans,
        "crs": "EPSG:4326"
    })

    # 保存合并后的文件
    with rasterio.open(output_file, "w", **out_meta) as dest:
        dest.write(mosaic)

    print(f"合并完成，文件保存为: {output_file}")

    # 关闭所有源文件
    for src in src_files_to_mosaic:
        src.close()


merge_tif_files_for_one(r'H:\land30m2010\制作成新国标标准', 'china') # 运行成功

def merge_tif_files_for_one_rasterio(input_path, merge_name):
    """
    合并文件夹下的所有tif文件为一个文件。
    输出文件保存在输入的文件夹下创建的merged文件夹中
    参数:
    input_path -- 输入文件夹的路径，包含所有tif文件。
    merge_name -- 输出合并文件的名称。
    """
    # 获取文件夹下的所有tif文件
    input_files = glob.glob(os.path.join(input_path, '*.tif'))
    print(f"查找到 {len(input_files)} 个tif文件。")

    if not input_files:
        print("没有找到任何tif文件。")
        return

    # 存储有效的tif文件
    src_files_to_mosaic = []

    for fn in input_files:
        src = rasterio.open(fn)
        if src is None:
            print(f"文件 {fn} 无法打开，跳过此文件。")
            continue
        src_files_to_mosaic.append(src)

    # 如果没有有效的输入文件，退出函数
    if not src_files_to_mosaic:
        print("没有有效的输入文件，无法进行合并。")
        return

    # 确保输出文件夹存在
    output_file = os.path.join(input_path, 'merged', merge_name + '_merged_rasterio.tif')
    os.makedirs(os.path.dirname(output_file), exist_ok=True)

    # 使用rasterio.merge进行合并
    mosaic, out_trans = merge(src_files_to_mosaic)

    # 获取第一个文件的元数据
    out_meta = src_files_to_mosaic[0].meta.copy()

    # 更新元数据
    out_meta.update({
        "driver": "GTiff",
        "height": mosaic.shape[1],
        "width": mosaic.shape[2],
        "transform": out_trans,
        "crs": "EPSG:4326"
    })

    # 保存合并后的文件
    with rasterio.open(output_file, "w", **out_meta) as dest:
        dest.write(mosaic)

    print(f"合并完成，文件保存为: {output_file}")

    # 关闭所有源文件
    for src in src_files_to_mosaic:
        src.close()


# merge_tif_files_for_one_rasterio(r'H:\land30m2010\制作成新国标标准', 'china') # 12的文件运行成功，全部未测试